package homework24;

//用户输入出生日期（月-日），计算距离他的下个生日还有几天（注意：2月29的处理）
import java.util.*;
import java.text.*;

public class Birthday {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入出生日期（月-日）：");
		String s = input.next();
		char[] c = s.toCharArray();
		int month = 0, day = 0;
		int days = 0;
		int i = 0;
		for (; i < c.length; i++) {
			if (c[i] == '-') {
				break;
			}
		}
		for (int j = 0; j < c.length; j++) {
			// 除了横线-位以外其他位置有输入不是数字的一律输入有误
			if (!Character.isDigit(c[j]) && j != i) {
				System.out.println("输入有误");
				return;
			}
		}
		// 当i==c.length表示没有找到横线-，输入有误
		if (i == c.length) {
			System.out.println("输入有误！");
			return;
		} else {
			// 检测月份和日是否匹配，如果不匹配，则输入有误
			month = new Integer(s.substring(0, i));
			day = new Integer(s.substring(i + 1, c.length));
			switch (month) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				if (day > 31 || day == 0) {
					System.out.println("输入有误");
					return;
				}
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				if (day > 30 || day == 0) {
					System.out.println("输入有误");
					return;
				}
				break;
			case 2:
				if (day > 29 || day == 0) {
					System.out.println("输入有误");
					return;
				}
				break;
			default:
				System.out.println("输入有误");
				return;
			}
		}
		// 创建两个日期，cNow表示现在的时间，ca用来记录下次生日
		Calendar ca = Calendar.getInstance();
		Calendar cNow = Calendar.getInstance();
		// 判断月份和日在今年有没有到（判断今年有没有到生日），如果还没有，则从今年开始查找
		if (month - 1 > cNow.get(Calendar.MONTH)
				|| month - 1 == cNow.get(Calendar.MONTH)
				&& day > cNow.get(Calendar.DAY_OF_MONTH)) {
			// 判断是不是2月29日，如果是，则进行下面
			if (month == 2 && day == 29) {
				for (int j = 0;; j++) {
					// 从今年开始查找闰年
					ca.set(Calendar.YEAR, cNow.get(Calendar.YEAR) + j);
					if (ca.getActualMaximum(Calendar.DAY_OF_YEAR) == 366) {
						ca.set(Calendar.MONTH, month - 1);
						ca.set(Calendar.DAY_OF_MONTH, day);
						break;
					}
				}
				// 如果今年不是闰年，未来某一年是闰年，则需要多加上中间每一个不是闰年的365天
				if (ca.get(Calendar.YEAR) > cNow.get(Calendar.YEAR)) {
					days += (ca.get(Calendar.YEAR) - cNow.get(Calendar.YEAR) - 1) * 365;
					days += ca.get(Calendar.DAY_OF_YEAR) + 365
							- cNow.get(Calendar.DAY_OF_YEAR);
				} else {// 如果今年就是闰年，直接生日的天数减当前天数即可
					days += ca.get(Calendar.DAY_OF_YEAR)
							- cNow.get(Calendar.DAY_OF_YEAR);
				}
			} else {// 如果不是2月29日，那今年一定有生日，直接减即可求出天数
				ca.set(Calendar.YEAR, cNow.get(Calendar.YEAR));
				ca.set(Calendar.MONTH, month - 1);
				ca.set(Calendar.DAY_OF_MONTH, day);
				days += ca.get(Calendar.DAY_OF_YEAR)
						- cNow.get(Calendar.DAY_OF_YEAR);
			}
		} else {// 如果今年已经过了生日了，则从第二年开始查找
			// 如果生日是2月29日
			if (month == 2 && day == 29) {
				for (int j = 1;; j++) {// 从第二年开始查找闰年
					ca.set(Calendar.YEAR, cNow.get(Calendar.YEAR) + j);
					if (ca.getActualMaximum(Calendar.DAY_OF_YEAR) == 366) {
						ca.set(Calendar.MONTH, month - 1);
						ca.set(Calendar.DAY_OF_MONTH, day);
						break;
					}
				}
				// 加上中间不是闰年的每年365天
				days += (ca.get(Calendar.YEAR) - cNow.get(Calendar.YEAR) - 1) * 365;
				// 再加上今年之后的天数以及闰年2月29日之前的天数
				days += ca.get(Calendar.DAY_OF_YEAR) + 365
						- cNow.get(Calendar.DAY_OF_YEAR);
			} else {
				// 如果不是2月29日生日，则第二年一定会过生日，直接算天数
				ca.set(Calendar.YEAR, cNow.get(Calendar.YEAR));
				ca.set(Calendar.MONTH, month - 1);
				ca.set(Calendar.DAY_OF_MONTH, day);
				days += ca.get(Calendar.DAY_OF_YEAR) + 365
						- cNow.get(Calendar.DAY_OF_YEAR);
			}
		}
		System.out.println("下次到你的生日还有" + days + "天");
	}
}
